package com.pe.pgn.clubpgn.webapp.controller.tarjetapersona;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.domain.ClpbEstacion;
import com.pe.pgn.clubpgn.domain.ClpbTarjetaPersona;
import com.pe.pgn.clubpgn.domain.ClpdTipoTarjetaPersona;
import com.pe.pgn.clubpgn.domain.beans.BNRango;
import com.pe.pgn.clubpgn.domain.beans.BNTarjetaPersona;
import com.pe.pgn.clubpgn.service.TarjetaPersonaService;
import com.pe.pgn.clubpgn.webapp.controller.BaseFormController;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;

@Controller
@RequestMapping("/tarjetapersona/**")
public class TarjetaPersonaController extends BaseFormController {

	@Autowired
	private TarjetaPersonaService tarjetaPersonaService;
	
	@RequestMapping(value = "/tarjetapersonalist.html")
    public @ModelAttribute("tarjetaPersona")BNTarjetaPersona listarTarjetasPersonas(
    		@ModelAttribute("tarjetaPersona") BNTarjetaPersona tarjetaPersona,
    		@RequestParam(value = "search", required = false) String search,Model model) {

		List<ClpbEstacion> estaciones = tarjetaPersonaService.obtenerEstaciones();
		if(StringUtils.isBlank(search)){
			
			List<ClpbTarjetaPersona> tarjetasPersonas = tarjetaPersonaService.obtenerTarjetasPersonas();
			model.addAttribute("tarjetasPersonas", tarjetasPersonas);
			
		}else{
			
			List<ClpbTarjetaPersona> tarjetasPersonas = tarjetaPersonaService.buscarTarjetas(
			tarjetaPersona.getCoCodigoTarjetaPersona(), tarjetaPersona.getCoEstacion(), 
			tarjetaPersona.getDeNombre(), tarjetaPersona.getDesFechaInicio(), 
			tarjetaPersona.getStStrTarjetaPersona(), tarjetaPersona.getStStrAnulada());
			model.addAttribute("tarjetasPersonas", tarjetasPersonas);
		}
		
		model.addAttribute("estaciones", estaciones);
		model.addAttribute("tarjeta_date_format", CLPConstantes.DATE_PATTERN);
		return tarjetaPersona;
    }
    
	@RequestMapping(value = "/tarjetapersonagroupform.html", method = RequestMethod.GET)
	public @ModelAttribute("tarjetaPersona") BNTarjetaPersona crearGrupoTarjetaPersona(Model model) {

		BNTarjetaPersona tarjetaPersona = tarjetaPersonaService.obtenerMaximoCodigoTarjetaPersona();		
		List<ClpdTipoTarjetaPersona> tiposTarjetasPersonas = tarjetaPersonaService.obtenerTiposTarjetasPersonas();
		model.addAttribute("tiposTarjetasPersonas", tiposTarjetasPersonas);
		return tarjetaPersona;
	}
	
	@RequestMapping(value = "/tarjetapersonagroupform.html", method = RequestMethod.POST)
	public String guardarGrupoTarjetaPersona(@ModelAttribute("tarjetaPersona")  BNTarjetaPersona tarjetaPersona,
			BindingResult result, SessionStatus status, HttpServletRequest request, Model model) {

		try {
			
			if (result.hasErrors()) {
				model.addAttribute("tarjetaPersona", tarjetaPersona);
				List<ClpdTipoTarjetaPersona> tiposTarjetasPersonas = tarjetaPersonaService.obtenerTiposTarjetasPersonas();
				model.addAttribute("tiposTarjetasPersonas", tiposTarjetasPersonas);
				return "/tarjetapersona/tarjetapersonagroupform";
			}
			
			if(tarjetaPersona.getDaFechaInicioVigencia().compareTo(tarjetaPersona.getDaFechaFinVigencia()) > 0){
				
				saveError(request, getText("errors.comparando.fechas", 
						new Object []{getText("common.vigencia.fin", request.getLocale()),
						getText("common.vigencia.inicio", request.getLocale())}, 
						request.getLocale()));
				model.addAttribute("tarjetaPersona", tarjetaPersona);
				List<ClpdTipoTarjetaPersona> tiposTarjetasPersonas = tarjetaPersonaService.obtenerTiposTarjetasPersonas();
				model.addAttribute("tiposTarjetasPersonas", tiposTarjetasPersonas);
				return "/tarjetapersona/tarjetapersonagroupform";
			}
			
			boolean existeRango = tarjetaPersonaService.existeRango(tarjetaPersona);
			if(existeRango){
				model.addAttribute("tarjetaPersona", tarjetaPersona);
				List<ClpdTipoTarjetaPersona> tiposTarjetasPersonas = tarjetaPersonaService.obtenerTiposTarjetasPersonas();
				model.addAttribute("tiposTarjetasPersonas", tiposTarjetasPersonas);
				saveError(request, getText("tarjetapersonaform.error.exists.group", request.getLocale()));
				return "/tarjetapersona/tarjetapersonagroupform";
			}
			
			tarjetaPersonaService.guardarGrupoTarjetasPersonas(tarjetaPersona);			
			saveMessage(request, getText("tarjetapersonaform.group.added", request.getLocale()));
			return "redirect:tarjetapersonalist.html";
			
		} catch (Exception e) {
			model.addAttribute("tarjetaPersona", tarjetaPersona);
			List<ClpdTipoTarjetaPersona> tiposTarjetasPersonas = tarjetaPersonaService.obtenerTiposTarjetasPersonas();
			model.addAttribute("tiposTarjetasPersonas", tiposTarjetasPersonas);
			saveError(request, getText("errors.general", request.getLocale()));
			return "/tarjetapersona/tarjetapersonagroupform";
		}
	}		
	
	@RequestMapping(value = "/tarjetapersonaupdategroupform.html", method = RequestMethod.GET)
	public @ModelAttribute("tarjetaPersonaUpdate") BNTarjetaPersona verActualizacionGrupoTarjetaPersona(Model model) {

		model = asignarVariablesComunesdeActualizacion(model, new BNTarjetaPersona());
		return new BNTarjetaPersona();
	}			
	
	@RequestMapping(value = "/tarjetapersonaupdategroupform.html", method = RequestMethod.POST)
	public String actualizarGrupoTarjetaPersona(@ModelAttribute("tarjetaPersonaUpdate")  BNTarjetaPersona tarjetaPersona,
			BindingResult result, SessionStatus status, HttpServletRequest request, Model model) {
		
		if (result.hasErrors()) {
			model = asignarVariablesComunesdeActualizacion(model, tarjetaPersona);
			return "/tarjetapersona/tarjetapersonaupdategroupform";
		}
		
		if(tarjetaPersona.getDaFechaInicioVigencia().compareTo(tarjetaPersona.getDaFechaFinVigencia()) > 0){
			
			saveError(request, getText("errors.comparando.fechas", 
					new Object []{getText("common.vigencia.fin", request.getLocale()),
					getText("common.vigencia.inicio", request.getLocale())}, 
					request.getLocale()));
			model = asignarVariablesComunesdeActualizacion(model, tarjetaPersona);
			return "/tarjeta/tarjetapersonaupdategroupform";
		}

		boolean existeRango = tarjetaPersonaService.existeRango(tarjetaPersona);
		if(!existeRango){
			model = asignarVariablesComunesdeActualizacion(model, tarjetaPersona);
			saveError(request, getText("tarjetapersonaform.error.not.exists.group", request.getLocale()));
			return "/tarjetapersona/tarjetapersonaupdategroupform";
		}
		
		boolean existenAsignados = tarjetaPersonaService.existenCodigosAsignadosEnRango(tarjetaPersona);
		if(existenAsignados){
			model = asignarVariablesComunesdeActualizacion(model, tarjetaPersona);
			saveError(request, getText("tarjetapersonaform.rangos.asignados", request.getLocale()));
			return "/tarjetapersona/tarjetapersonaupdategroupform";
		}
 
		tarjetaPersonaService.asignarTarjetasPersonas(tarjetaPersona);
		saveMessage(request, getText("tarjetapersonaform.group.updated", request.getLocale()));
		return "redirect:tarjetapersonalist.html";
	}	 	
	
	protected Model asignarVariablesComunesdeActualizacion(Model model, BNTarjetaPersona tarjetaPersona){
		
		model.addAttribute("tarjetaPersonaUpdate", tarjetaPersona);
		
		List<ClpbEstacion> estaciones = tarjetaPersonaService.obtenerEstaciones();
		model.addAttribute("estaciones", estaciones);
		
		List<BNRango> rangos = tarjetaPersonaService.obtenerRangosTarjetaDisponibles();
		model.addAttribute("rangos", rangos);		
		
		List<ClpdTipoTarjetaPersona> tiposTarjetasPersonas = tarjetaPersonaService.obtenerTiposTarjetasPersonas();
		model.addAttribute("tiposTarjetasPersonas", tiposTarjetasPersonas);
		
		return model;
	}

	@RequestMapping(value = "/tarjetapersonaform.html", method = RequestMethod.GET)
	public @ModelAttribute("tarjetaPersona")  ClpbTarjetaPersona verTarjeta(
				@RequestParam(value = "id", required = false) Long id, Model model) {

		List<ClpbEstacion> estaciones = tarjetaPersonaService.obtenerEstaciones();
		model.addAttribute("estaciones", estaciones);
		
		List<ClpdTipoTarjetaPersona> tiposTarjetasPersonas = tarjetaPersonaService.obtenerTiposTarjetasPersonas();
		model.addAttribute("tiposTarjetasPersonas", tiposTarjetasPersonas);
		
		if (id != null) {
			ClpbTarjetaPersona tarjetaPersona = tarjetaPersonaService.obtenerTarjetaPersona(id);
			tarjetaPersona.setDesFechaInicio(CalendarUtil.calendarToString(CLPConstantes.DATE_PATTERN, tarjetaPersona.getDaFechaInicioVigencia()));
			tarjetaPersona.setDesFechaFin(CalendarUtil.calendarToString(CLPConstantes.DATE_PATTERN, tarjetaPersona.getDaFechaFinVigencia()));
			return tarjetaPersona;
		}
		return new ClpbTarjetaPersona();
	}
	
	@RequestMapping(value = "/tarjetapersonaform.html", method = RequestMethod.POST)
	public String guardarTarjetaPersona(@ModelAttribute("tarjetaPersona") ClpbTarjetaPersona tarjetaPersona,
			BindingResult result, SessionStatus status, HttpServletRequest request) {

		try {
			if (result.hasErrors()) {
				return "/tarjetapersona/tarjetapersonaform";
			}
			
			tarjetaPersona.setDaFechaInicioVigencia(CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, tarjetaPersona.getDesFechaInicio()));
			tarjetaPersona.setDaFechaFinVigencia(CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, tarjetaPersona.getDesFechaFin()));
			
			if(tarjetaPersona.getDaFechaInicioVigencia().compareTo(tarjetaPersona.getDaFechaFinVigencia()) > 0){
				
				saveError(request, getText("errors.comparando.fechas", 
						new Object []{getText("common.vigencia.fin", request.getLocale()),
						getText("common.vigencia.inicio", request.getLocale())}, 
						request.getLocale()));
				return "/tarjetapersona/tarjetapersonaform";
			}
			
			tarjetaPersonaService.guardarTarjetaPersona(tarjetaPersona);
			saveMessage(request, getText("tarjetapersonaform.added", tarjetaPersona.getCoCodigoTarjetaPersona(), 
					request.getLocale()));
			return "redirect:tarjetapersonalist.html";
			
		} catch (Exception e) {
			saveError(request, getText("errors.general", request.getLocale()));
			return "/tarjetapersona/tarjetapersonaform";
		}
	}
	
	@RequestMapping(value = "/eliminartarjetapersona.html")
	public String eliminarTarjetaPersona(@RequestParam(value = "id", required = false) Long id, 
			HttpServletRequest request) {

		try {
			tarjetaPersonaService.eliminarTarjetaPersona(id);
			saveMessage(request, getText("tarjetapersonaform.deleted", request.getLocale()));
			return "redirect:tarjetapersonalist.html";
			
		} catch (Exception e) {
			saveError(request, getText("errors.general", request.getLocale()));
			return "/tarjetapersona/tarjetapersonaform";
		}
	}
}
